home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 SRC / Mac / Modules / res / ressupport.py < prev   
Text File  |  1995-12-12  |  3KB  |  143 lines

  1. # This script will generate the Resources interface for Python.
  2. # It uses the "bgen" package to generate C code.
  3. # It execs the file resgen.py which contain the function definitions
  4. # (resgen.py was generated by resscan.py, scanning the <Resources.h> header file).
  5.  
  6. import addpack
  7. addpack.addpack(':Tools:bgen:bgen')
  8.  
  9. from macsupport import *
  10.  
  11.  
  12. class ResMixIn:
  13.  
  14.     def checkit(self):
  15.         OutLbrace()
  16.         Output("OSErr _err = ResError();")
  17.         Output("if (_err != noErr) return PyMac_Error(_err);")
  18.         OutRbrace()
  19.         FunctionGenerator.checkit(self) # XXX
  20.  
  21. class ResFunction(ResMixIn, FunctionGenerator): pass
  22. class ResMethod(ResMixIn, MethodGenerator): pass
  23.  
  24. # includestuff etc. are imported from macsupport
  25.  
  26. includestuff = includestuff + """
  27. #include <Resources.h>
  28.  
  29. #define resNotFound -192 /* Can't include <Errors.h> because of Python's "errors.h" */
  30. """
  31.  
  32. finalstuff = finalstuff + """
  33.  
  34. /* Alternative version of ResObj_New, which returns None for null argument */
  35. PyObject *OptResObj_New(itself)
  36.     Handle itself;
  37. {
  38.     ResourceObject *it;
  39.     if (itself == NULL) {
  40.         Py_INCREF(Py_None);
  41.         return Py_None;
  42.     }
  43.     return ResObj_New(itself);
  44. }
  45.  
  46. OptResObj_Convert(v, p_itself)
  47.     PyObject *v;
  48.     Handle *p_itself;
  49. {
  50.     if ( v == Py_None ) {
  51.         *p_itself = NULL;
  52.         return 1;
  53.     }
  54.     if (!ResObj_Check(v))
  55.     {
  56.         PyErr_SetString(PyExc_TypeError, "Resource required");
  57.         return 0;
  58.     }
  59.     *p_itself = ((ResourceObject *)v)->ob_itself;
  60.     return 1;
  61. }
  62.  
  63. """
  64.  
  65. initstuff = initstuff + """
  66. """
  67.  
  68. module = MacModule('Res', 'Res', includestuff, finalstuff, initstuff)
  69.  
  70. getattrHookCode = """
  71. if (strcmp(name, "size") == 0)
  72.     return PyInt_FromLong(GetHandleSize(self->ob_itself));
  73. if (strcmp(name, "data") == 0) {
  74.     PyObject *res;
  75.     char state;
  76.     state = HGetState(self->ob_itself);
  77.     HLock(self->ob_itself);
  78.     res = PyString_FromStringAndSize(
  79.         *self->ob_itself,
  80.         GetHandleSize(self->ob_itself));
  81.     HUnlock(self->ob_itself);
  82.     HSetState(self->ob_itself, state);
  83.     return res;
  84. }
  85. if (strcmp(name, "__members__") == 0)
  86.     return Py_BuildValue("[ss]", "data", "size");
  87. """
  88.  
  89. setattrCode = """
  90. static int
  91. ResObj_setattr(self, name, value)
  92.     ResourceObject *self;
  93.     char *name;
  94.     PyObject *value;
  95. {
  96.     char *data;
  97.     long size;
  98.     
  99.     if (strcmp(name, "data") != 0 || value == NULL )
  100.         return -1;
  101.     if ( !PyString_Check(value) )
  102.         return -1;
  103.     size = PyString_Size(value);
  104.     data = PyString_AsString(value);
  105.     /* XXXX Do I need the GetState/SetState calls? */
  106.     SetHandleSize(self->ob_itself, size);
  107.     if ( MemError())
  108.         return -1;
  109.     HLock(self->ob_itself);
  110.     memcpy((char *)*self->ob_itself, data, size);
  111.     HUnlock(self->ob_itself);
  112.     /* XXXX Should I do the Changed call immedeately? */
  113.     return 0;
  114. }
  115. """
  116.  
  117. class ResDefiniton(GlobalObjectDefinition):
  118.  
  119.     def outputCheckNewArg(self):
  120.         Output("if (itself == NULL) return PyMac_Error(resNotFound);")
  121.  
  122.     def outputGetattrHook(self):
  123.         Output(getattrHookCode)
  124.         
  125.     def outputSetattr(self):
  126.         Output(setattrCode)
  127.  
  128.  
  129. resobject = ResDefiniton('Resource', 'ResObj', 'Handle')
  130. module.addobject(resobject)
  131.  
  132. functions = []
  133. resmethods = []
  134.  
  135. execfile('resgen.py')
  136. execfile('resedit.py')
  137.  
  138. for f in functions: module.add(f)
  139. for f in resmethods: resobject.add(f)
  140.  
  141. SetOutputFileName('Resmodule.c')
  142. module.generate()
  143.